package com.blog.cmrpersonalblog.dto.notification.respnose;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 通知聚合响应DTO
 * 用于展示聚合后的通知（如："张三、李四等5人赞了你的文章"）
 */
@Data
public class NotificationGroupResponse {

    /**
     * 聚合键（用于分组）
     * 格式：type_targetType_targetId
     * 例如：LIKE_article_123
     */
    private String groupKey;

    /**
     * 通知类型
     */
    private String type;

    /**
     * 通知类型名称
     */
    private String typeName;

    /**
     * 目标类型
     */
    private String targetType;

    /**
     * 目标ID
     */
    private Long targetId;

    /**
     * 目标信息（文章、评论等）
     */
    private TargetInfo target;

    /**
     * 聚合数量（该组通知的总数）
     */
    private Integer count;

    /**
     * 未读数量
     */
    private Integer unreadCount;

    /**
     * 发送者列表（最多显示3个）
     */
    private List<SenderInfo> senders;

    /**
     * 其他发送者数量（如果超过3个）
     */
    private Integer otherSendersCount;

    /**
     * 聚合标题
     * 例如："张三、李四等5人赞了你的文章"
     */
    private String aggregatedTitle;

    /**
     * 最新通知时间（该组中最新的通知时间）
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime latestTime;

    /**
     * 最早通知时间（该组中最早的通知时间）
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime earliestTime;

    /**
     * 是否全部已读
     */
    private Boolean allRead;

    /**
     * 目标标题（内部字段，从Sql查询映射，用于构建target对象）
     * 不应该暴露给前端，应该使用 target.title
     */
    @JsonIgnore
    private String targetTitle;

    /**
     * 目标内容摘要（内部字段，从Sql查询映射，用于构建target对象）
     * 不应该暴露给前端，应该使用 target.contentSummary
     */
    @JsonIgnore
    private String targetContentSummary;

    /**
     * 文章标题（用于 COMMENT/REPLY 类型的聚合标题）
     * 例："xxx评论了你的文章《文章标题》：\"评论内容\""
     */
    @JsonIgnore
    private String articleTitle;

    /**
     * 发送者信息
     */
    @Data
    public static class SenderInfo {
        /**
         * 用户ID
         */
        private Long userId;

        /**
         * 昵称
         */
        private String nickName;

        /**
         * 头像
         */
        private String avatar;

        /**
         * 该发送者的最新通知时间
         */
        private String latestTime;
    }

    /**
     * 目标信息
     */
    @Data
    public static class TargetInfo {
        /**
         * 目标ID
         */
        private Long id;

        /**
         * 目标标题（文章标题、评论内容等）
         */
        private String title;

        /**
         * 目标内容摘要
         */
        private String contentSummary;

        /**
         * 目标类型
         */
        private String type;

        /**
         * 目标URL（跳转链接）
         */
        private String url;
    }

    /**
     * 获取通知类型名称
     */
    public String getTypeName() {
        if (typeName != null) {
            return typeName;
        }
        switch (type) {
            case "FOLLOW":
                return "新增粉丝";
            case "LIKE":
                return "点赞";
            case "COLLECT":
                return "收藏";
            case "COMMENT":
                return "评论";
            case "REPLY":
                return "回复";
            case "MENTION":
                return "提及";
            case "SYSTEM":
                return "系统通知";
            default:
                return "未知";
        }
    }

    /**
     * 生成聚合标题
     */
    public String generateAggregatedTitle() {
        if (senders == null || senders.isEmpty()) {
            return aggregatedTitle;
        }

        StringBuilder sb = new StringBuilder();

        // 添加发送者名称
        int displayCount = Math.min(senders.size(), 3);
        for (int i = 0; i < displayCount; i++) {
            if (i > 0) {
                sb.append("、");
            }
            sb.append(senders.get(i).getNickName());
        }

        // 如果有更多发送者
        if (otherSendersCount != null && otherSendersCount > 0) {
            sb.append("等").append(count).append("人 ");
        } else {
            sb.append(" ");
        }

        // 添加操作描述
        switch (type) {
            case "FOLLOW":
                sb.append("关注了你");
                break;
            case "LIKE":
                if ("article".equals(targetType)) {
                    sb.append("赞了你的文章");
                } else if ("comment".equals(targetType)) {
                    sb.append("赞了你的评论");
                }
                break;
            case "COLLECT":
                sb.append("收藏了你的文章");
                break;
            case "COMMENT":
                sb.append("评论了");
                break;
            case "REPLY":
                sb.append("回复了你的评论");
                break;
            case "MENTION":
                sb.append("在评论中提到了你");
                break;
            default:
                break;
        }

        // 添加目标信息
        if (target != null) {
            // 对于评论，title 是被回复的评论内容，contentSummary 是回复内容
            if ("comment".equals(targetType)) {
                // COMMENT类型：显示文章+评论内容
                if ("COMMENT".equals(type)) {
                    // 先显示文章标题
                    if (articleTitle != null) {
                        sb.append("你的文章《").append(articleTitle).append("》");
                    } else {
                        sb.append("你的文章");
                    }
                    // 再显示评论内容
                    if (target.getTitle() != null) {
                        sb.append(": \"").append(target.getTitle()).append("\"");
                    }
                }
                // REPLY类型：显示回复的内容
                else if ("REPLY".equals(type) && target.getContentSummary() != null) {
                    sb.append(": \"").append(target.getContentSummary()).append("\"");
                }
                // 其他类型（LIKE）：显示目标评论内容
                else if (target.getTitle() != null) {
                    sb.append(" \"").append(target.getTitle()).append("\"");
                }
            } else if (target.getTitle() != null) {
                // 对于文章，使用书名号
                sb.append("《").append(target.getTitle()).append("》");
            }
        }

        return sb.toString();
    }
}

